package pda.agenda.ihm;

import pda.agenda.controller.*;

import javax.swing.table.DefaultTableModel;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.Enumeration;

public class TableModelJour extends DefaultTableModel {

	/**
	 * Tableau qui fait le lien entre la valeur affiché dans une cellule, sa position dans le tableau
	 * <br />et la date de début.
	 */
	private Hashtable<Hashtable<Integer, Integer>, Hashtable<GregorianCalendar, String>> datas;


	public TableModelJour() {
		this.datas = new Hashtable<Hashtable<Integer, Integer>, Hashtable<GregorianCalendar, String>>();
	}

	public Object getValueAt(int cellule, int colonne) {
		if(colonne == 0) {
			return cellule+"h";
		} else if(!datas.isEmpty()) {
			// Creation de la clé
			Hashtable<Integer, Integer> cle = new Hashtable<Integer, Integer>(1);
			Integer cellInteger = new Integer(cellule);
			Integer colonneInteger = new Integer(colonne);
			cle.put(cellInteger, colonneInteger);
			// Si cette clé existe
			if(datas.containsKey(cle)) {
				Hashtable<GregorianCalendar, String> val = datas.get(cle);
				Enumeration it = val.keys();
				while(it.hasMoreElements()) {
					return (String) val.get(it.nextElement());				
				}
			} else {
				return "";
			}
		}
		return "";
	}

	public GregorianCalendar getCleAt(int cellule, int colonne) {

		Hashtable<Integer, Integer> cle = new Hashtable<Integer, Integer>(1);
		Integer cellInteger = new Integer(cellule);
		Integer colonneInteger = new Integer(colonne);
		cle.put(cellInteger, colonneInteger);

		Hashtable<GregorianCalendar, String> val = datas.get(cle);
		Enumeration it = val.keys();
		while(it.hasMoreElements()) {
			return (GregorianCalendar) it.nextElement();				
		}
		return null;
	}

	public int getRowCount() {
		return 24;
	}

	public int getColumnCount() {
		return 2;
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	public void setValueAt(GregorianCalendar dateDebut, GregorianCalendar dateFin, GregorianCalendar dateCourante, String texte) {

		int cellule = 0;
		int colonne = 1;

		// Place l'activité dans une (ou plus) tranche d'heure(s).
		for(cellule=0; cellule < this.getRowCount(); cellule++) {
			colonne = 1;

			dateCourante.set(Calendar.HOUR_OF_DAY, cellule);

			if(dateCourante.getTimeInMillis() >= dateDebut.getTimeInMillis() && dateCourante.getTimeInMillis() <= dateFin.getTimeInMillis()) {
				// S'il existe déjà une activité dans cette tranche horaire
				// On la met dans la colonne d'à coté.
				while(this.getValueAt(cellule,colonne) != "") {
					colonne++;
				}
				// On demarre "colonne" à 1, donc il n'est pas necessaire de comparé avec "colonne-1"
				if(this.getColumnCount() < colonne) {
					this.addColumn("");
				}
				// Creation de la clé
				Integer cellInteger = new Integer(cellule);
				Integer colonneInteger = new Integer(colonne);

				Hashtable<Integer, Integer> cle = new Hashtable<Integer, Integer>(1);
				cle.put(cellInteger, colonneInteger);

				// Creation de la valeur
				Hashtable<GregorianCalendar, String> valeur = new Hashtable<GregorianCalendar, String>(1);
				valeur.put(dateDebut, texte);

				// On met le tout, dans le Hashtable principal
				this.datas.put(cle, valeur);

				fireTableCellUpdated(cellule, colonne);
			}
		}
	}
} // fin de la classe
